<?php
class AdminUserController    extends Zone_Action{
	public function fields($default=NULL){
		$data = array(
			username 	=> array(
				type 		=> 'CHAR',
				no_empty	=>true,
				min_length	=>4,
				max_length 	=>30,
				form_label 	=> 'Tên đăng nhập',			
			),
			password 	=> array(
				type 		=> 'PASSWORD',
				no_empty	=>true,
				min_length =>4,
				max_length =>32,
				form_label => 'Mật khẩu',
			),
			email 	=> array(
				type 		=> 'EMAIL',
				no_empty	=> true,
				form_label  => 'Email',
			),
			phone 	=> array(
				type 		=> 'PHONE',
				no_empty	=> true,
				form_label  => 'phone',
			),
			fullname 	=> array(
				type 		=> 'CHAR',
				no_empty	=> true,
				form_label  => 'Họ tên',
			),
			group_id	=>array(
				type		=>'INT',
				form_label	=>'Thuộc nhóm'
			),
			department_id	=>array(
				type		=>'INT',
				form_label	=>'Thuộc nhóm'
			),
			personnel_id	=>array(
				type		=>'INT',
				form_label	=>'Thuộc nhóm'
			),
			inherit_roles =>array(
				type			=> 'ENUM',
				value			=> array('yes','no'),
				default_value	=> 'yes'
			),
			roles =>array(
				type			=>'LIST',
				value			=> explode(',','login,email,message,yahoo,'
					.'manage_admin,manage_news,manage_forum,'
					.'task,add_project,add_task,diploma,add_diploma,'
					.'document,add_document,personnel,'
					.'calendar,add_private_calendar,add_department_calendar,add_company_calendar,'
					.'crm,crm_admin,asset,manage_asset,contact_company,contact_person,contact_company_manage,contact_share'),
				form_label		=>'Quyền'
			)
		);	
		return $data;	
	}	

	public function indexAction(){
		$user_id = get_user_id();
		$vars = array();
		$WHERE = array();
		$order_by = " ORDER BY `a`.`is_admin`,`a`.`ID` DESC";
		
		$current_page = max(getInt('p',1),1);		
		$range_page   = max(getInt('rp',50),50);
		
		if( isset($_REQUEST['p']) ){
			$vars['p'] = $current_page;
		}
		
		if( isset($_REQUEST['rp'])){
			$vars['rp'] = $range_page;			
		}
		
		$limit = "LIMIT ".($current_page-1)*$range_page.",$range_page";				
		$field_order = array('username','name','date_created','group_id');
		foreach( $field_order as $f ){
			if( get('order_by') == $f ){
				$order_by = "ORDER BY $f ". ( get('order_type') == 'desc' ? 'desc' : 'asc');
				$vars['order_by'] = $f;
				if( get('order_type') == 'desc' ){
					$vars['order_by']='desc';
				}
				break;	
			}	
		}		
		
		$total = $this->Model->fetchOne("SELECT COUNT(*) FROM `users` as `a` WHERE `is_deleted`='no'");
		$posts = $this->Model->fetchAll("
			SELECT `a`.*,`b`.`title` as `group_title`,`c`.`name` as `personnel_name`,`c`.`id` as `personnel_id`,
					`d`.`title` as `department_title`
			FROM `users` as `a` 
			LEFT JOIN `groups` as `b` 
				ON `b`.`ID`=`a`.`group_id`  
			LEFT JOIN `personnels` as `c` 
				ON `c`.`ID`=`a`.`personnel_id`  
			LEFT JOIN `departments` as `d` 
				ON `d`.`ID`=`a`.`department_id`  
			WHERE `is_deleted`='no' $order_by $limit ");
		
		$a = $vars;
		unset($a['p']);
		$page = page_ajax('#Admin/User?'.to_query_configs($a).'&p=', $total , $range_page, $current_page);
			
		$this->set(array(
			page	=> $page,
			total	=> $total,
			vars	=> $vars,
			users	=> $posts
		));
	}
	
	public function addAction(){
		$personnels = $this->Model->fetchAll("SELECT * FROM `personnels` WHERE `is_draft`='no' ORDER BY `name`");				
		$groups 	= $this->Model->fetchAll("SELECT * FROM `groups` ORDER BY `title`");
		$departments = $this->Model->fetchAll("SELECT * FROM `departments` ORDER BY `parent_id`");
		$checkSum = $this->Model->fetchOne("SELECT COUNT(*) 
			FROM `users` 
			WHERE `is_deleted`='no'");
			
		//$maxUser = 10;	
		if( $maxUser ){ 		
			if($checkSum > $maxUser + 1 ){
				return $this->setJSON(array(
					alert	=> error("Số lượng người dùng đã vượt quá mức cho phép.")
				));
			}
		}
		
		$this->set(array(
			personnels	=> $personnels,
			groups		=> $groups,
			departments => $departments
		));
		
		
		if(isPost()){					
			loadClass("ZData");
			$form = new ZData();
			$form->addFields( $this->fields());
			$data = $form->getData();
			
			if( !is_array($data)){
				return $this->setJSON(array(
					message	=> error($data)
				));
			}
			
			$data['date_created'] = mysql_date();
			
			if( get('inherit_roles') != 'no' ){
				$form->removeField('roles');
				$data['roles'] = '';
			}

			
			if( preg_match("#[^a-z0-9]#ui", $data['username']) ){
				return $this->setJSON(array(
					message	=> error('Tên tài khoản chỉ gồm chữ cái thường, in hoa và số đếm.')
				));			
			}			
			
			if($this->Model->fetchRow("SELECT * 
				FROM `users` 
					WHERE UPPER(`username`)=UPPER('{$data['username']}')
						AND `is_deleted`='no'")){
				return $this->setJSON(array(
					message => error("Tên tài khoản này đã được sử dụng.")
				));
			}
			
			if( !$this->Model->fetchRow("SELECT * FROM `groups` WHERE `ID`='{$data['group_id']}'") ){
				return $this->setJSON(array(
					message => error("Nhóm người dùng không tồn tại.")
				));
			}
			
			$this->Model->insert('users',$data);
			$this->Model->removeCache('users*');
			
			return $this->setJSON(array(
				redirect	=> '#Admin/User'
			));
		}
	}
	
	public function editAction(){
		$user_id = getInt('ID',0);		
		$user = $this->Model->fetchRow("SELECT * FROM `users` WHERE `is_deleted`='no' AND `ID`='$user_id'");
		
		if( !$user ){
			return $this->setContent(error("Người dùng không tồn tại hoặc đã bị xóa."));
		} 		
		
		$personnels = $this->Model->fetchAll("SELECT * FROM `personnels` WHERE `is_draft`='no' ORDER BY `name`");				
		$groups 	= $this->Model->fetchAll("SELECT * FROM `groups` ORDER BY `title`");
		$departments = $this->Model->fetchAll("SELECT * FROM `departments` ORDER BY `parent_id`");
		
		$this->set(array(
			post		=> $user,
			personnels	=> $personnels,
			groups		=> $groups,
			departments => $departments
		));
		
		if(isPost()){
			loadClass("ZData");
			$form = new ZData();
			$form->addFields( $this->fields($user));
			
			if( !isset($_POST['changepass']) ){
				$form->removeField('password');
			}
			
			$data = $form->getData();

			if( !is_array($data)){
				return $this->setJSON(array(
					message	=> error($data)
				));
			}
			
			if( get('inherit_roles') != 'no' ){
				$form->removeField('roles');
				$data['roles'] = '';
			}
			
			if( preg_match("#[^a-z0-9]#ui", $data['username']) ){
				return $this->setJSON(array(
					message	=> error('Tên tài khoản chỉ gồm chữ cái thường, in hoa và số đếm')
				));			
			}			
			
			if($this->Model->fetchRow("SELECT * 
				FROM `users` 
					WHERE UPPER(`username`)=UPPER('{$data['username']}')
						AND `is_deleted`='no' AND `ID`<>'$user_id'")){
				return $this->setJSON(array(
					message => error('Tên tài khoản này đã được sử dụng')
				));
			}
			
			if( !$this->Model->fetchRow("SELECT * FROM `groups` WHERE `ID`='{$data['group_id']}'") ){
				return $this->setJSON(array(
					message => error('Nhóm người dùng không tồn tại')
				));
			}

			$this->Model->update('users',$data,"`ID`='$user_id'");
			$this->Model->removeCache('users*');
			return $this->setJSON(array(
				redirect	=> "#Admin/User"
			));
		}
	}

	public function deleteAction(){
		$user_id = get('ID',0);
		$post = $this->Model->fetchRow("SELECT * FROM `users` WHERE `ID`='$user_id' LIMIT 1");
			
		if( !$post ){
			return $this->setJSON(array(
				alert	=> 'Bản ghi đã bị xóa hoặc không tồn tại'
			));
		}	

		if( $user['is_admin'] == 'yes' ){
			return $this->setJSON(array(
				alert => 'Tài khoản admin này không thể xóa'
			));
		}			
		
		$this->Model->update('users',array(
			is_deleted	=> 'yes'
		),"`ID`='$user_id'");
		
		//remove relation
		if( $post['photo'] ){
			@unlink('files/photo/'.$post['photo']);
		}		
	
		$this->Model->removeCache('users*');
		return $this->setJSON(array(
			redirect => '#Admin/User'
		));
	}

}
?>